import * as fs from "fs";
import { extname } from "path";
import { Injectable } from "@nestjs/common";
import { formatFileSize } from "../utils/index";

@Injectable()
export class FileService {
  // 文件数据处理函数
  fileDataHanlde(file: Express.Multer.File) {
    if (!file) return {};
    return {
      mimetype: file.mimetype,
      url: `http://127.0.0.1:3000/${file.path}`,
      size: file.size,
      fileSize: formatFileSize(file.size),
      filename: file.filename,
    };
  }
  // 单文件上传
  uploadFile(file: Express.Multer.File) {
    // 到这里其实文件已经上传到服务器本地了，需要有后续的存储需求，比如要上传到云存储服务中，可以在这里继续处理
    // 返回文件URL
    return this.fileDataHanlde(file);
  }
  // 多文件上传
  uploadFiles(files: Express.Multer.File[]) {
    return files.map(file => {
      return this.fileDataHanlde(file);
    });
  }
  // 多大文件上传
  uploadBigFiles(files: Express.Multer.File[], filename: string) {
    const pattern = /^(.+)_\d+\..*$/;
    const name = filename.match(pattern)[1];
    const chunkDir = "public/uploads/chunks_" + name;
    // 检查临时目录是否存在，如果不存在则创建
    if (!fs.existsSync(chunkDir)) {
      fs.mkdirSync(chunkDir);
    }
    // 将文件复制到临时目录中
    fs.copyFileSync(files[0].path, chunkDir + "/" + filename);
    // 删除原始文件
    fs.rmSync(files[0].path);
  }
  // 合并大文件
  mergeFile(hash) {
    return new Promise(resolve => {
      const chunkDir = "public/uploads/chunks_" + hash;
      const files = fs.readdirSync(chunkDir);
      let count = 0;
      let startPos = 0;
      // 遍历所有文件
      files.map(file => {
        const filePath = chunkDir + "/" + file;
        const stream = fs.createReadStream(filePath);
        const newPath = "public/uploads/" + hash + extname(file);
        // 创建写入流，并指定起始位置
        stream.pipe(fs.createWriteStream(newPath, { start: startPos })).on("finish", () => {
          count++;
          // 如果所有文件都已处理完成
          if (count === files.length) {
            // 删除临时目录
            fs.rm(chunkDir, { recursive: true }, () => {
              resolve({
                url: `http://127.0.0.1:3000/${newPath}`,
              });
            });
          }
        });
        // 更新起始位置
        startPos += fs.statSync(filePath).size;
      });
    });
  }
}
